import type { App } from 'vue';
import { useUserInfo } from '/@/stores/userInfo';
import { judementSameArr } from '/@/utils/arrayOperation';

/**
 * 用户权限指令
 * @directive 单个权限验证（v-auth="xxx"）
 * @directive 多个权限验证，满足一个则显示（v-auths="[xxx,xxx]"）
 * @directive 多个权限验证，全部满足则显示（v-auth-all="[xxx,xxx]"）
 * @directive 单个角色验证（v-role="xxx"）
 * @directive 多个角色验证，满足一个则显示（v-roles="[xxx,xxx]"）
 * @directive 多个角色验证，全部满足则显示（v-role-all="[xxx,xxx]"）
 */
export function authDirective(app: App) {
	// 单个权限验证（v-auth="xxx"）
	app.directive('auth', {
		mounted(el, binding) {
			const stores = useUserInfo();
			if (stores.userInfos.isDebug == false) {
				if (!stores.userInfos.authBtnList.some((v: string) => {
					return v.toLowerCase() === binding.value.toLowerCase()
				})) el.parentNode.removeChild(el);
			}
		},
	});
	// 多个权限验证，满足一个则显示（v-auths="[xxx,xxx]"）
	app.directive('auths', {
		mounted(el, binding) {
			let flag = false;
			const stores = useUserInfo();
			stores.userInfos.authBtnList.map((val: string) => {
				binding.value.map((v: string) => {
					if (val === v) flag = true;
				});
			});
			if (!flag) el.parentNode.removeChild(el);
		},
	});
	// 多个权限验证，全部满足则显示（v-auth-all="[xxx,xxx]"）
	app.directive('auth-all', {
		mounted(el, binding) {
			const stores = useUserInfo();
			const flag = judementSameArr(binding.value, stores.userInfos.authBtnList);
			if (!flag) el.parentNode.removeChild(el);
		},
	});

	// 单个角色验证（v-role="xxx"）
	app.directive('role', {
		mounted(el, binding) {
			const stores = useUserInfo();
			if (stores.userInfos.isDebug == false) {
				// 检查 binding.value 是否为字符串
				if (typeof binding.value !== 'string') return;
				if (!stores.userInfos.roles.some((role: any) => {
					return role.RoleCode?.toLowerCase() === binding.value.toLowerCase()
				})) el.parentNode.removeChild(el);
			}
		},
	});
	// 多个角色验证，满足一个则显示（v-roles="[xxx,xxx]"）
	app.directive('roles', {
		mounted(el, binding) {
			let flag = false;
			const stores = useUserInfo();
			// 检查 binding.value 是否为数组
			if (!Array.isArray(binding.value)) return;
			stores.userInfos.roles.map((userRole: any) => {
				binding.value.map((roleCode: string) => {
					if (typeof roleCode === 'string' && userRole.RoleCode?.toLowerCase() === roleCode.toLowerCase()) flag = true;
				});
			});
			if (!flag) el.parentNode.removeChild(el);
		},
	});
	// 多个角色验证，全部满足则显示（v-role-all="[xxx,xxx]"）
	app.directive('role-all', {
		mounted(el, binding) {
			const stores = useUserInfo();
			// 检查 binding.value 是否为数组
			if (!Array.isArray(binding.value)) return;
			const userRoleCodes = stores.userInfos.roles.map((role: any) => role.RoleCode?.toLowerCase());
			const requiredRoleCodes = binding.value
				.filter((roleCode: any) => typeof roleCode === 'string')
				.map((roleCode: string) => roleCode.toLowerCase());
			const flag = judementSameArr(requiredRoleCodes, userRoleCodes);
			if (!flag) el.parentNode.removeChild(el);
		},
	});
}
